/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.Query;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import pojo.Doutor;
import pojo.Excessao;

/**
 *
 * @author Rodolfo
 */
@Stateless
public class DaoExcessao implements DaoExcessaoLocal {

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    
    @PersistenceContext
    private EntityManager manager;

    @Override
    public Excessao salvar(Excessao excessao) throws Exception{
        try {
            excessao = this.manager.merge(excessao);
            this.manager.flush();
        } catch (Exception e) {
                if (e.getMessage().contains("Code: 1062")) {
                throw new Exception("Esta excessão já foi criada.");
            } else {
                throw new Exception("Erro desconhecido ao excluir.");
            }
        }
        
        System.out.println("Passou no ejb");
        return excessao;
    }

    @Override
    public void excluir(Excessao excessao) throws Exception {
        Excessao e;
        e = this.manager.find(Excessao.class, excessao.getIdExcessao());
        if (e == null) {
            throw new Exception("Nenhum registro com o id informado, tente buscar o registro novamente.");
        }
        try {
            this.manager.remove(e);
            this.manager.flush();
        } catch (Exception e1) {
            System.out.println("erroooooooooooooooooooooooooooooooooo");
            if (e1.getMessage().contains("Code: 1451")) {
                throw new Exception("Registro utilizado em outra tabela.");
            } else {
                throw new Exception("Erro desconhecido ao excluir.");
            }
        }
    }
    
    @Override
    public Doutor buscaExcessaoPorId(Integer doutor) {
        System.out.println("enttrou aki busca por id no excessao");
        return (Doutor) this.manager.createNamedQuery("Doutor.findByIdDoutor").setParameter("idDoutor", doutor).getSingleResult();
    }
    
    @Override
    public List<String> horariosDisponiveisPorDoutor(Doutor doutor){
        Doutor d = (Doutor) this.manager.createNamedQuery("Doutor.findByIdDoutor").setParameter("idDoutor", doutor.getIdDoutor()).getSingleResult();
        Date horaInicial;
        Date horaFinal;
        horaInicial = d.getHorarioTrabInicial();
        horaFinal = d.getHorarioTrabFinal();
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
        List<String> listadeHorarios = new ArrayList<String>();
        while (horaFinal.after(horaInicial)) {
            System.out.println(sdf.format(horaInicial));
            listadeHorarios.add(sdf.format(horaInicial));
            System.out.println("adicionou horario");
            
            
            horaInicial = new Date(horaInicial.getTime() + 30 * 60 * 1000);


        }
         return listadeHorarios;
    
    }
    
    @Override
    public List<Excessao> retornaExcessaoPorParametros(Doutor doutor, String diaSemana, Date dataInicial, Date dataFinal, Date horaInicial, Date horaFinal){
                
		String query = "SELECT e FROM Excessao e where e.codDoutor = :codDoutor";
		if(diaSemana != null){
                        query += " and e.dia_semana = :diaSemana";
                }
                if(dataInicial != null){
                        query += " and e.data >= :dataInicial";
                }
                if(dataFinal != null){
                        query += " and e.data <= :dataFinal";
                }
                if(horaInicial != null){
                        query += " and e.horario >= :horaInicial";
                }
                if(horaFinal != null){
                        query += " and e.horario <= :horaFinal";
                }
                Query query2 =  this.manager.createQuery(query);
                query2.setParameter("codDoutor", doutor);
		if (diaSemana != null)
			query2.setParameter("diaSemana", diaSemana);
		if (dataInicial != null)
			query2.setParameter("dataInicial", dataInicial);
		if (dataFinal != null)
			query2.setParameter("dataFinal", dataFinal);
		if (horaInicial != null)
			query2.setParameter("horaInicial", horaInicial);
		if (horaFinal != null)
			query2.setParameter("horaFinal", horaFinal);

	
             return query2.getResultList();
    
    }
    
}
